# # 使用 open 打开一个文件
# fd = open('e:/Python_code/test.txt', 'r')
# print(type(fd))     # <class '_io.TextIOWrapper'>
# print(fd)

# 文件再打开完之后,使用玩之后,也就一定要关闭
# 打开文件,其实是在申请一定的系统资源~
# 不再使用文件的时候,资源就应该及时释放~
# 否则就可能造成文件泄露.进一步的导致其他部分的代码无法顺利打开文件了~
# 正是因为一个系统的资源是有限的,因此一个程序能打开的文件个数,也是有上限的.

# # 打开文件的上限
# flist = []
# count = 0
# while True:
#     f = open('e:/Python_code/test.txt', 'r')
#     flist.append(f)
#     count += 1
#     print(f'打开文件的个数:{count}')
# 打开文件的个数可以在系统中通过一些设置项来配置打开文件的最大数目

# # 关闭文件
# f = open('e:/Python_code/test.txt', 'r')
# f.close()

# Python有一个重要的垃圾回收机制(GC)，自动把不使用的变量,给进行释放~
# 不能依赖自动释放机制,因为这个机制不一定及时


# # 使用write 来实现写文件的操作
# f = open('e:/Python_code/test.txt', 'w')
# f.write('hello rose!')
# f.close()

# # 写文件的时候需要 w 的方式打开,使用 r 打开会抛出异常
# f = open('e:/Python_code/test.txt', 'r')
# f.write('hello rose!')  # not writable
# f.close()

# # 写方式打开,其实有两种情况,一种是直接写方式打开,一种是追加写方式打开~
# f = open('e:/Python_code/test.txt', 'w')
# f.close()
# # 如果使用写方式打开，会清空掉文件原有的内容

# # 使用 a 方式打开则不会情况,会写入文件的末尾
# f = open('e:/Python_code/test.txt', 'a')
# f.write('hello rose!')
# f.close()

# # 使用read 来读取文件内容,指定读几个字符
# f = open('e:/Python_code/test.txt', 'r', encoding='UTF8')
# result = f.read(2)
# print(result)
# f.close()


# # 更常见的需求是按行来读取
# # 最简单的办法直接for循环
# f = open('e:/Python_code/test.txt', 'r', encoding='UTF8')
# for line in f:
#     print(f'line = {line}', end='') # end默认加换行操作
# f.close()
# # 可以给print再多设定个参数,修改print自动添加换行的操作


# # 还可以使用 readlines 方法直接把整个文件的所有内容都读出来,按照行组织到一个列表中.
# f = open('e:/Python_code/test.txt', 'r', encoding='UTF8')
# lines = f.readlines()
# print(lines)
# f.close()


# # 有些情况还是非常容易遗漏 close的,防不胜防
# def func():
#     f = open('e:/Python_code/test.txt', 'r', encoding='UTF8')
#     # 中间来写其他的操作文件的逻辑~
#     # 万一中间的代码里,有条件判定,函数返回,抛出异常
#     if cond:
#         # 进行条件处理
#         return
#
#     f.close()

# 使用上下文管理器,就可以解决这个问题.
def func():
    with open('e:/Python_code/test.txt', 'r', encoding='UTF8') as f:
        # 进行文件这里的处理逻辑
        # 假设这里有很多的代码
        if cond:
            return


# 上下文管理器起到的效果~~
# 当with 对应的代码块执行结束,就会自动执行f的close







